/**
 * datagrid扩展导出excel方法
 * @cond {Object} 执行参数 json类型
 * cond.fileName：导出文件名，选填，默认为reslut.xls
 * cond.url：导出文件的服务路径，默认不填，如有自己的业务处理，自行开发并指向相应url
 * cond.sqlId：导出数据的执行sql，选填，如果datagrid的queryParams已经包含该信息，不需再传此参数
 * cond.sqlParam：导出数据执行sql的查询传参，选填，如果datagrid的queryParams已经包含该信息，不需再传此参数
 * cond.dbName：执行sql的数据库名
 * cond.fileType：导出文件类型，xls或csv。默认xls
 * cond.title：导出文件表头配置，默认使用datagrid标题配置。
 *             文件类型xls格式规则：“标题,占行数,占列数,是否隐藏;!”，“;”标识一个单元格描述结束，“!”标识一行结束。例：列1,2,1,false;列2,1,1,false;!列3,1,1,false;!...
 *             文件类型csv格式规则：“标题1;标题2;...”。例：列1;列2;...
 * cond.columns：导出文件列配置，Array类型，默认使用datagrid列配置。例：["col1","col2"...]
 * cond.containHidden：导出文件是否包含表格隐藏列，默认false
 * cond.waterMark：导出文件水印内容值，属性为空时不添加水印
 * cond.remote：是否从远程服务导出，默认false
 * cond.showLoading：文件导出处理过程中是否显示grid的处理提示遮罩；默认true
 * cond.afterLoad：文件导出处理完毕后处理事件
 */
$.extend($.fn.datagrid.methods, {

    getExcel: function (jq, cond) {

        return jq.each(function () {
            
            cond = $.extend({
                url: "common/getGridExcel",
                fileType: "xlsx",
                containHidden: false,
                remote: false,
                showLoading: true
            }, cond);
            var tab = $(this), afterLoad = cond.afterLoad;
            delete cond.afterLoad; //删除下载事件，否则在post时会自动执行
            if ($.data(this, "datagrid")) { //是datagrid
                tab.datagrid("loading"); //开启遮罩
                var opt = tab.datagrid("options");
                if (!cond.sqlId && !cond.data) {
                    var data = tab.datagrid("getData"), cnt = data.rows.length, total = data.total || cnt;
                    if (total > 20000) {
                        //cond.remote = true;
                        if (total > 1000000) cond.fileType = "csv";
                        else if (cond.fileType == "xls") cond.fileType = "xlsx";
                    }
                    if (!cond.remote && (!opt.queryParams || !opt.pagination || (opt.pagination && total == cnt))) {
                        cond.data = JSON.stringify(data.rows);
                    } else if (opt.queryParams && opt.queryParams.sqlId) {
                        cond.sqlId = opt.queryParams.sqlId;
                        if (opt.queryParams.sqlParam) cond.sqlParam = opt.queryParams.sqlParam;
                        if (opt.queryParams.dbName) cond.dbName = opt.queryParams.dbName;
                    }
                }
                if (!cond.fileName) cond.fileName = opt.title ? $("<c>" + opt.title + "</c>").text() : "result";
                if (!cond.title) {
                    cond.title = serializeTitle(opt, cond.fileType, cond.containHidden);
                    cond.columns = (tab.datagrid("getColumnFields", true) || []).concat(tab.datagrid("getColumnFields"));
                    for (var i = 0; i < cond.columns.length; i++) {
                        var fopt = tab.datagrid("getColumnOption", cond.columns[i]);
                        if ((fopt.hidden == true || fopt.checkbox) && !cond.containHidden) { // 不包含隐藏列则删除//移除多选框
                            cond.columns.splice(i, 1);
                            i--;
                        } else if (fopt.formula) { // 公式列处理
                            var fml = fopt.formula.expression;
                            if (fopt.formula.round) {
                                if (fopt.formula.calculateOnExport) fml = "(" + fml + ").toFixed(" + fopt.formula.round + ")"; //直接计算
                                else fml = "ROUND(" + fml + "," + fopt.formula.round + ")"; //转为excel公式
                            }
                            cond.columns[i] = "Formula(" + fml + "," + (fopt.formula.calculateOnExport == true ? "true" : "false") + ")";
                        }
                    }
                }
            } else {
                if (!cond.fileName) cond.fileName = "result";
            }
            cond.columns = JSON.stringify(cond.columns);
            $.post(cond.url, cond, function (data) {
            	if (afterLoad) afterLoad();
                if (data == "error") {
                    $.messager.alert("提示", "文件下载失败，请重试或联系管理员！", "error");
                    tab.datagrid("loaded"); //取消遮罩
                } else if (cond.remote == true) { //远程服务下载
                    $.messager.alert("提示", "系统已在后台为您生成文件，请您稍后在【资源工具->我的地盘】中查询并下载文件！", "info");
                    tab.datagrid("loaded"); //取消遮罩
                } else {
                    var a = $("#datagrid_excel_link");
                    if (!a.length) a = $("<a id='datagrid_excel_link'/>").appendTo(document.body);
                    a.attr("href", "common/getGridExcel?fileId=" + data + "&fileName=" + encodeURI(cond.fileName) + "&fileType=" + cond.fileType)[0].click();
                    tab.datagrid("loaded"); //取消遮罩
                }
            });
        });

        function serializeTitle(opt, type, containHidden) {
            var title = "", containFrozen = !$.isEmptyObject(opt.frozenColumns);
            for (var i = 0; i < opt.columns.length; i++) {
                if (containFrozen && opt.frozenColumns[i]) for (var j = 0; j < opt.frozenColumns[i].length; j++) title += genTitleStr(opt.frozenColumns[i][j], type, containHidden);
                for (var j = 0; j < opt.columns[i].length; j++) {
                	var col = opt.columns[i][j];
                	if(col.checkbox) continue;
                	title += genTitleStr(opt.columns[i][j], type, containHidden, containFrozen);
                }
                if (type != "csv") title += "!";
            }
            return title;
        }

        function genTitleStr(td, type, containHidden, containFrozen) {
        	if (!containHidden && (td.hidden == true || td.checkbox == true)) return "";
            var txt = $("<c>" + td.title.replace(/<\/?br>/g, "\n") + "</c>").text().replace(/,/g, "，").replace(/;/g, "；");
            if (type != "csv") {
                var cs = containHidden ? (td.colspan || 1) : ($((containFrozen ? ".datagrid-view2 " : "") + "#" + td.id).attr("colspan") || 1);
                return txt + "," + (td.rowspan || 1) + "," + cs + "," + (td.hidden || false) + ";";
            } else return txt + ";";
        }


    }
});
